/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package Clases.provider;

import Clases.util.ClasesAdapterFactory;

import java.util.ArrayList;
import java.util.Collection;

import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;

import org.eclipse.emf.edit.provider.ChangeNotifier;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.IChangeNotifier;
import org.eclipse.emf.edit.provider.IDisposable;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.IItemPropertySource;
import org.eclipse.emf.edit.provider.INotifyChangedListener;
import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;

/**
 * This is the factory that is used to provide the interfaces needed to support Viewers.
 * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
 * The adapters also support Eclipse property sheets.
 * Note that most of the adapters are shared among multiple instances.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated
 */
public class ClasesItemProviderAdapterFactory extends ClasesAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {
	/**
	 * This keeps track of the root adapter factory that delegates to this adapter factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected ComposedAdapterFactory parentAdapterFactory;

	/**
	 * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected IChangeNotifier changeNotifier = new ChangeNotifier();

	/**
	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected Collection<Object> supportedTypes = new ArrayList<Object>();

	/**
	 * This constructs an instance.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ClasesItemProviderAdapterFactory() {
		supportedTypes.add(IEditingDomainItemProvider.class);
		supportedTypes.add(IStructuredItemContentProvider.class);
		supportedTypes.add(ITreeItemContentProvider.class);
		supportedTypes.add(IItemLabelProvider.class);
		supportedTypes.add(IItemPropertySource.class);
	}

	/**
	 * This keeps track of the one adapter used for all {@link Clases.Diagrama} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected DiagramaItemProvider diagramaItemProvider;

	/**
	 * This creates an adapter for a {@link Clases.Diagrama}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createDiagramaAdapter() {
		if (diagramaItemProvider == null) {
			diagramaItemProvider = new DiagramaItemProvider(this);
		}

		return diagramaItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link Clases.Clase} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected ClaseItemProvider claseItemProvider;

	/**
	 * This creates an adapter for a {@link Clases.Clase}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createClaseAdapter() {
		if (claseItemProvider == null) {
			claseItemProvider = new ClaseItemProvider(this);
		}

		return claseItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link Clases.Atributo} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected AtributoItemProvider atributoItemProvider;

	/**
	 * This creates an adapter for a {@link Clases.Atributo}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createAtributoAdapter() {
		if (atributoItemProvider == null) {
			atributoItemProvider = new AtributoItemProvider(this);
		}

		return atributoItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link Clases.Relacion} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected RelacionItemProvider relacionItemProvider;

	/**
	 * This creates an adapter for a {@link Clases.Relacion}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createRelacionAdapter() {
		if (relacionItemProvider == null) {
			relacionItemProvider = new RelacionItemProvider(this);
		}

		return relacionItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link Clases.Metodo} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected MetodoItemProvider metodoItemProvider;

	/**
	 * This creates an adapter for a {@link Clases.Metodo}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createMetodoAdapter() {
		if (metodoItemProvider == null) {
			metodoItemProvider = new MetodoItemProvider(this);
		}

		return metodoItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link Clases.Pointcut} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected PointcutItemProvider pointcutItemProvider;

	/**
	 * This creates an adapter for a {@link Clases.Pointcut}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createPointcutAdapter() {
		if (pointcutItemProvider == null) {
			pointcutItemProvider = new PointcutItemProvider(this);
		}

		return pointcutItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link Clases.Operador_O} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected Operador_OItemProvider operador_OItemProvider;

	/**
	 * This creates an adapter for a {@link Clases.Operador_O}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createOperador_OAdapter() {
		if (operador_OItemProvider == null) {
			operador_OItemProvider = new Operador_OItemProvider(this);
		}

		return operador_OItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link Clases.Operador_NO} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected Operador_NOItemProvider operador_NOItemProvider;

	/**
	 * This creates an adapter for a {@link Clases.Operador_NO}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createOperador_NOAdapter() {
		if (operador_NOItemProvider == null) {
			operador_NOItemProvider = new Operador_NOItemProvider(this);
		}

		return operador_NOItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link Clases.Operador_Y} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected Operador_YItemProvider operador_YItemProvider;

	/**
	 * This creates an adapter for a {@link Clases.Operador_Y}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createOperador_YAdapter() {
		if (operador_YItemProvider == null) {
			operador_YItemProvider = new Operador_YItemProvider(this);
		}

		return operador_YItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link Clases.Advice} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected AdviceItemProvider adviceItemProvider;

	/**
	 * This creates an adapter for a {@link Clases.Advice}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createAdviceAdapter() {
		if (adviceItemProvider == null) {
			adviceItemProvider = new AdviceItemProvider(this);
		}

		return adviceItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link Clases.Parametro} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected ParametroItemProvider parametroItemProvider;

	/**
	 * This creates an adapter for a {@link Clases.Parametro}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createParametroAdapter() {
		if (parametroItemProvider == null) {
			parametroItemProvider = new ParametroItemProvider(this);
		}

		return parametroItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link Clases.Metodo_Call} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected Metodo_CallItemProvider metodo_CallItemProvider;

	/**
	 * This creates an adapter for a {@link Clases.Metodo_Call}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createMetodo_CallAdapter() {
		if (metodo_CallItemProvider == null) {
			metodo_CallItemProvider = new Metodo_CallItemProvider(this);
		}

		return metodo_CallItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link Clases.Metodo_Execution} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected Metodo_ExecutionItemProvider metodo_ExecutionItemProvider;

	/**
	 * This creates an adapter for a {@link Clases.Metodo_Execution}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createMetodo_ExecutionAdapter() {
		if (metodo_ExecutionItemProvider == null) {
			metodo_ExecutionItemProvider = new Metodo_ExecutionItemProvider(this);
		}

		return metodo_ExecutionItemProvider;
	}

	/**
	 * This returns the root adapter factory that contains this factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ComposeableAdapterFactory getRootAdapterFactory() {
		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
	}

	/**
	 * This sets the composed adapter factory that contains this factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
		this.parentAdapterFactory = parentAdapterFactory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean isFactoryForType(Object type) {
		return supportedTypes.contains(type) || super.isFactoryForType(type);
	}

	/**
	 * This implementation substitutes the factory itself as the key for the adapter.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter adapt(Notifier notifier, Object type) {
		return super.adapt(notifier, this);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object adapt(Object object, Object type) {
		if (isFactoryForType(type)) {
			Object adapter = super.adapt(object, type);
			if (!(type instanceof Class) || (((Class<?>)type).isInstance(adapter))) {
				return adapter;
			}
		}

		return null;
	}

	/**
	 * This adds a listener.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void addListener(INotifyChangedListener notifyChangedListener) {
		changeNotifier.addListener(notifyChangedListener);
	}

	/**
	 * This removes a listener.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void removeListener(INotifyChangedListener notifyChangedListener) {
		changeNotifier.removeListener(notifyChangedListener);
	}

	/**
	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void fireNotifyChanged(Notification notification) {
		changeNotifier.fireNotifyChanged(notification);

		if (parentAdapterFactory != null) {
			parentAdapterFactory.fireNotifyChanged(notification);
		}
	}

	/**
	 * This disposes all of the item providers created by this factory. 
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void dispose() {
		if (diagramaItemProvider != null) diagramaItemProvider.dispose();
		if (claseItemProvider != null) claseItemProvider.dispose();
		if (atributoItemProvider != null) atributoItemProvider.dispose();
		if (relacionItemProvider != null) relacionItemProvider.dispose();
		if (metodoItemProvider != null) metodoItemProvider.dispose();
		if (pointcutItemProvider != null) pointcutItemProvider.dispose();
		if (operador_OItemProvider != null) operador_OItemProvider.dispose();
		if (operador_NOItemProvider != null) operador_NOItemProvider.dispose();
		if (operador_YItemProvider != null) operador_YItemProvider.dispose();
		if (adviceItemProvider != null) adviceItemProvider.dispose();
		if (parametroItemProvider != null) parametroItemProvider.dispose();
		if (metodo_CallItemProvider != null) metodo_CallItemProvider.dispose();
		if (metodo_ExecutionItemProvider != null) metodo_ExecutionItemProvider.dispose();
	}

}
